package com.xiaolun.threadConnect;

/**
 * 1、资源类-空调类
 * 2、先生产才能消费
 */
class AirCondition {
	private int number = 0;
	public synchronized void increment() throws Exception { //制热
		//1、判断（这个活该不该我干）
		//用while来解决虚假唤醒
		System.out.println("----------------A线程进来了----------------");
		while (number != 0) {
			System.out.println("----------------A线程等待");
			this.wait();
		}
		//2、干活
		number++;
		System.out.println(Thread.currentThread().getName() + "\t" + number);
		//2、通知（通知老板我干完了）
		this.notifyAll();
	}

	public synchronized void decrement() throws Exception { //制冷
		//1、判断
		System.out.println("----------------B线程进来了----------------");
		while (number == 0) {
			System.out.println("----------------B线程等待");
			this.wait();
		}
		//2、干活
		number--;
		System.out.println(Thread.currentThread().getName() + "\t" + number);
		//3、通知
		this.notifyAll();
	}
}
/**
 * 题目：现在两个线程，可以操作初始值为零的一个变量，
 * 实现一个线程对该变量加1，一个线程对该变量减1，
 * 实现交替，来10轮，变量初始值为0。
 * 1、高内聚低耦合的前提下：线程操作资源类
 * 2、判断/干活/通知
 * 3、在多线程里面，要防止多线程的虚假唤醒。（乘客二次过安检）
 */
public class ProdConsumerDemo01 {
	public static void main(String[] args) {
		AirCondition airCondition = new AirCondition();
		new Thread(() -> {
			for (int i = 0; i < 10; i++) {
				try {
					airCondition.decrement();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}, "B").start();
		new Thread(() -> {
			for (int i = 0; i < 10; i++) {
				try {
					airCondition.increment();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}, "A").start();
	}
}
